package com.xiake.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseDao<T, PK extends Serializable> {

	  /**
	   * 查询所有列表，无条件参数 例如：select * from user
	   * 
	   * @return List<T>
	   * */
	  public List<T> getAll() throws Exception;

	  /**
	   * 查询所有列表，并去除重复项
	   * 
	   * @return List<T>
	   */
	  public List<T> getAllDistinct() throws Exception;

	  /**
	   * 按照指定条件分页查询
	   * 
	   * @param conditions：查询条件集合
	   * @return List<T>
	   * */
	  public List<T> page(Map<?, ?> conditions) throws Exception;

	  /**
	   * 根据指定条件分页查询扩展方法
	   * 
	   * @param conditions：条件集合
	   * @param specificName：分页查询扩展方法后缀名
	   * @return List<T>
	   */
	  public List<T> page(Map<?, ?> conditions, String specificName) throws Exception;
	  
	  /**
	   * 按照指定条件分页查询
	   * 
	   * @param conditions：查询条件集合
	   * @return List<T>
	   * */
	  public List<T> pageList(Map<?, ?> conditions) throws Exception;

	  /**
	   * 根据指定条件分页查询扩展方法
	   * 
	   * @param conditions：条件集合
	   * @param specificName：分页查询扩展方法后缀名
	   * @return List<T>
	   */
	  public List<T> pageList(Map<?, ?> conditions, String specificName) throws Exception;  

	  /**
	   * 按照指定条件查询列表 例如：select * from user where xxxxx
	   * 
	   * @param 查询条件集合
	   * @return List<T>
	   * */
	  public List<T> query(Map<?, ?> conditons) throws Exception;

	  /**
	   * 按照指定条件查询列表扩展方法 例如：select * from user where xxxxx
	   * 
	   * @param 查询条件集合
	   * @param 扩展方法后缀名
	   * @return List<T>
	   * */
	  public List<T> query(Map<?, ?> conditons, String specificName) throws Exception;

	  /**
	   * 根据主键获取对象
	   * */
	  public T get(PK id) throws Exception;


	  public T get(Map<?, ?> conditions, String specificName) throws Exception;

	  /**
	   * 根据指定条件查询记录
	   * 
	   * @param conditions：条件集合
	   * @return T
	   */
	  public T get(Map<?, ?> conditions) throws Exception;


	  /**
	   * 按照指定条件统计数据
	   * 
	   * @return int
	   * */
	  public int count(Map<?, ?> conditions) throws Exception;

	  /**
	   * 根据指定条件统计数据扩展方法
	   * 
	   * @param conditions：条件集合
	   * @param specificName：统计数据扩展方法后缀名
	   * @return int
	   */
	  public int countList(Map<?, ?> conditions, String specificName) throws Exception;
	  
	  /**
	   * 按照指定条件统计数据
	   * 
	   * @return int
	   * */
	  public int countList(Map<?, ?> conditions) throws Exception;

	  /**
	   * 根据指定条件统计数据扩展方法
	   * 
	   * @param conditions：条件集合
	   * @param specificName：统计数据扩展方法后缀名
	   * @return int
	   */
	  public int count(Map<?, ?> conditions, String specificName) throws Exception;  


	  /**
	   * 保存数据操作，根据ID是否为空来判断是添加操作，还是修改操作
	   * 
	   * @param object
	   * @return T
	   */
	  public Integer save(T object) throws Exception;

	  /**
	   * 保存数据操作扩展方法，根据ID是否为空来判断是添加操作，还是修改操作
	   * 
	   * @param object
	   * @param specificName:扩展方法后缀名
	   * @return T
	   */
	  public Integer save(T object, String specificName) throws Exception;


	  /**
	   * 根据指定条件删除数据
	   * 
	   * @param conditions：条件集合
	   */
	  public void remove(Map<String, Object> conditions) throws Exception;

	  /**
	   * 根据指定条件删除数据扩展方法
	   * 
	   * @param conditions：条件集合
	   * @param specificName：删除方法后缀名
	   */
	  public void remove(Map<String, Object> conditions, String specificName) throws Exception;

	  /**
	   * Generic method to get PersistentClass
	   */
	  public Class<T> getPersistentClass() throws Exception;

}
